﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using br.com.portocs.unidaacademico.dominio;
using br.com.portocs.unidaacademico.ui.views;
using br.com.portocs.unidaacademico.repositorio;

public partial class academico_OfertarCursos : PageView
{
    private OfertaCurso obj;

    private IList<DocumentoOfertaCurso> DocumentosObrigatorios
    {
        set { Session.Add("documentosObrigatorios", value); }
        get { return (IList<DocumentoOfertaCurso>)Session["documentosObrigatorios"]; }
    }


    private string AreaId = "ofertarCurso";
    private string pagAnterior = "OfertasCurso.aspx";
    private string linkNovaOferta = "OfertarCursos.aspx?acao=criar";
    private string linkTodasOfertas = "OfertasCursos.aspx";

    private string subTituloPaginaAlterar = "Alteração de Cadastro";
    private string subTituloPaginaCriar = "Cadastrando novo item...";

    private bool voltarAcaoCriar = true; // após ação do usuario, voltar para pag anterior se acao = criar
    private bool voltarAcaoAlterar = true; // após ação do usuario, voltar para pag anterior se acao = Alterar

    //função executada no page load
    private void OutrasFuncoesCarregamento()
    {

        if (recuperarAcaoNaViewState() == "alterar")
        {

        }

        //popular os ddls
        if (!Page.IsPostBack)
        {
            DocumentosObrigatorios = new List<DocumentoOfertaCurso>();

            //  Cursos
            preencheControleLista(cmbCursos, "Nome", "Id", new RepositorioBase<Curso>().RecuperaTodos(),"- selecione -" );

            //  Turno
            preencheControleLista(cmbTurnos, string.Empty, string.Empty, new ArrayList(Enum.GetNames(typeof (Turno))), "- selecione -");

            //  Planos de Pagamento
            preencheControleLista(cmbPlanosPagamento, "Descricao", "Id", new RepositorioBase<PlanoPagamento>().RecuperaTodos(),"- selecione -");

            //  Coordenadores
            preencheControleLista(cmbCoordenador, "Nome", "Id", new RepositorioBase<Professor>().RecuperaTodos(),"- selecione -");

            //  Documentos  
            preencheControleLista(cmbDocumentos, "Nome", "Id", new RepositorioBase<Documento>().RecuperaTodos(), "- selecione -");
        }

    }




    //definir propriedades no formulario ( carregamento da pag ) obj => form
    private void CarregarFormulario()
    {
        
    }

    //form => obj
    private void setarObjComInformacoesDoFormulario()
    {
        if (recuperarAcaoNaViewState() == "criar")
        {
            //alterar somente o nome da Classe----------------
            this.obj = new OfertaCurso();
            setarObjSessao(obj);
            //---------------------------

        }

        getObjSessao().Curso = new RepositorioBase<Curso>().RecuperarPorId(
            int.Parse(cmbCursos.SelectedValue));
        getObjSessao().Grade = new RepositorioBase<Grade>().RecuperarPorId(
            int.Parse(cmbGrade.SelectedValue));
        //getObjSessao().Turno = (Turno)Enum.Parse(typeof(Turno), cmbTurnos.SelectedItem.Text);
        getObjSessao().NumeroVagas = int.Parse(tbNumeroVagas.Text);
        getObjSessao().PlanoPagamento = new RepositorioBase<PlanoPagamento>().RecuperarPorId(
            int.Parse(cmbPlanosPagamento.SelectedValue));
        getObjSessao().Coordenador = new RepositorioBase<Professor>().RecuperarPorId(
            int.Parse(cmbCoordenador.SelectedValue));
        getObjSessao().Observacoes = tbObs.Text;
        getObjSessao().AnoReferencia = DateTime.Now.Year.ToString();
        getObjSessao().AdicionaDocumentos(DocumentosObrigatorios);
        
        getObjSessao().DataInicioOferta = Utilitarios.retornaDataPadraoEUA(tbDataInicio.Text);
        getObjSessao().DataFimOferta = Utilitarios.retornaDataPadraoEUA(tbDataFim.Text);
        getObjSessao().DataCriacao = DateTime.Now;

        if (string.IsNullOrEmpty(tbDescricao.Text))
            getObjSessao().Descricao = string.Format("{0} | {1} | {2}", cmbCursos.SelectedItem.Text, getObjSessao().AnoReferencia, cmbTurnos.SelectedItem.Text);
        else
            getObjSessao().Descricao = tbDescricao.Text;
        
        
    }

    //validações. se for para prosseguir com a ação do usuário, retornar true
    private bool formularioValidado()
    {
        bool retorno = true;
        litAviso.Text = string.Empty;

        litAviso.Text = "<b>DILTER,</b> por favor atente para as informações abaixo:<br /><br />";

        

        if (cmbCursos.SelectedValue.Equals(string.Empty))
        {
            retorno = false;
            
            litAviso.Text += "- Selecione um <b>Curso</b>.<br />";
        }

        if (cmbGrade.SelectedValue.Equals(string.Empty))
        {
            retorno = false;
            litAviso.Text += "- Selecione uma <b>Grade</b>.<br />";
        
        }

        if (cmbTurnos.SelectedValue.Equals(string.Empty))
        {
            retorno = false;
            litAviso.Text += "- Selecione um <b>Turno</b>.<br />";
        
        }

        if (tbDataInicio.Text.Equals(string.Empty) || tbDataFim.Text.Equals(string.Empty))
        {
            retorno = false;
            litAviso.Text += "- Informe corretamente um período de <b>Data Incial</b> e <b>Data Final</b> para a Oferta de Curso.<br />";
        
        }

        if (cmbPlanosPagamento.SelectedValue.Equals(string.Empty))
        {
            retorno = false;
            litAviso.Text += "- Selecione um <b>Plano de Pagamento</b>.<br />";
        
        }

        if(tbNumeroVagas.Text.Equals(string.Empty))
        {
            retorno = false;
            litAviso.Text += "- Informe o <b>Número de Vagas</b>.<br />";
            
        }

        if (cmbCoordenador.SelectedValue.Equals(string.Empty))
        {
            retorno = false;
            litAviso.Text += "- Selecione um <b>Coordenador</b>.<br /><br />";
            
        }

        if (!retorno) litAviso.Text += "*** Nada foi feito.";
        if (retorno) litAviso.Text = "";

        validacao.Visible = !retorno;

        return retorno;
    }

    private void FuncoesPosAcaoDisciplinaeAcaoAlterar()
    {
        exibeInformacao("Item alterado com sucesso.");
    }

    private void FuncoesPosAcaoDisciplinaeAcaoCriar()
    {
        exibeInformacao(string.Format("<b>Item cadastrado com sucesso.</b> <br /><br /> Próxima ação: <a href='{0}'>Nova Oferta</a> | <a href='{1}'>Listar todas</a>", linkNovaOferta, linkTodasOfertas));
    }

    private void exibeInformacao(string mensagem)
    {
        litInfo.Text = mensagem;
        info.Visible = true;
    }

    #region Não editável

    private long ItemId = 0;


    //retorna objeto
    protected OfertaCurso getObjSessao()
    {
        if (obj == null)
        {
            if (ViewState["ItemObj"] != null)
                obj = (OfertaCurso)ViewState["ItemObj"];
            else
                CarregarObjeto();
        }
        return this.obj;
    }

    protected void setarObjSessao(OfertaCurso objS)
    {
        //ViewState["ItemObj"] = objS;
        obj = objS;
    }

    //setar acao na ViewState
    protected void setarAcaoNaViewState(string acao)
    {
        ViewState["acao"] = acao;

    }
    //recuperar acao na ViewState
    protected string recuperarAcaoNaViewState()
    {
        return ViewState["acao"].ToString();
    }

    //carrega Objeto
    protected void CarregarObjeto()
    {
        if (ItemId > 0)
            this.obj = new br.com.portocs.unidaacademico.repositorio.RepositorioBase<OfertaCurso>().RecuperarPorId(ItemId);
        else
            this.obj = new OfertaCurso();

        setarObjSessao(this.obj);
    }

    //seta a propriedade do Id
    protected void setaIdQueryString()
    {
        if (Request.QueryString["ItemId"] != null)
            this.ItemId = long.Parse(Request.QueryString["ItemId"]);
        else
            this.ItemId = 0;
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        Page.MaintainScrollPositionOnPostBack = true;
        carregaArea(AreaId);

        //vendo o tipo inicial de comportamento em relação a estar criando ou alterando um obj
        if (!Page.IsPostBack)
        {
            if (Request.QueryString["acao"].ToString() != null)
                setarAcaoNaViewState(Request.QueryString["acao"].ToString());

            OutrasFuncoesCarregamento();

            if (recuperarAcaoNaViewState() == "alterar")
            {

                setaIdQueryString();

                if (!Page.IsPostBack)
                {

                    CarregarObjeto();
                    CarregarFormulario();
                }

                litSubtituloAcao.Text = subTituloPaginaAlterar;
            }
            else
            {
                litSubtituloAcao.Text = subTituloPaginaCriar;
            }



        }
    }


    //função executava ao clicar em "salvar alterações"
    protected void btCriarSalvar_Click(object sender, EventArgs e)
    {
        if (formularioValidado())
        {
            setarObjComInformacoesDoFormulario();
            OfertaCurso dest = new br.com.portocs.unidaacademico.repositorio
                .RepositorioBase<OfertaCurso>()
                .SalvarOuAtualizar(getObjSessao());

            setarObjSessao(dest);
            var acao = recuperarAcaoNaViewState();

            if (acao == "criar")
            {
                FuncoesPosAcaoDisciplinaeAcaoCriar();
                limparObjs();
                //Response.Redirect("Disciplinas.aspx");
            }

            else if (acao == "alterar")
            {
                FuncoesPosAcaoDisciplinaeAcaoAlterar();

                if (voltarAcaoAlterar)
                    Response.Redirect(pagAnterior);
            }
        }
    }

    private void limparObjs()
    {
        this.obj = null;
        setarObjSessao(null);

    }


    #endregion


    protected void cmbCursos_SelectedIndexChanged(object sender, EventArgs e)
    {
        preencheControleLista(cmbGrade, "Descricao", "Id",
                              new RepositorioBase<Curso>().RecuperarPorId(int.Parse(cmbCursos.SelectedValue)).Grades);
    }
    protected void btAdicionaDocumento_Click(object sender, EventArgs e)
    {
        DocumentosObrigatorios.Add(
            new DocumentoOfertaCurso
                {
                    Documento = new Documento
                                    {
                                        Id = int.Parse(cmbDocumentos.SelectedValue),
                                        Nome = cmbDocumentos.SelectedItem.Text
                                    },
                    Obrigatorio = chkDocumentoObrigatorio.Checked


                });

        grdDocumentos.DataSource = DocumentosObrigatorios;
        grdDocumentos.DataBind();
        
    }
}
